﻿// EXP0234.cpp :
// 基于上一个练习中的变量和语句编写一段程序，输出赋值前后变量的内容，你刚才的推断正确吗？如果不对，请反复研读本节的示例直到你明白错在何处为止。
//auto i = 0, * p = &i;
//auto sz = 0, pi = 3.14;//报错！auto已经推断为int，却需要推断为double
//
//int i = 0, & r = i; //auto推断为int
//auto a = r;//r是整型的引用，auto推断为int
//const int ci = i, & cr = ci;
//auto b = ci;//ci是常量，auto推断为int
//auto c = cr;//cr是引用，auto推断为int
//auto d = &i;//&i是变量地址，auto推断为int*
//auto e = &ci;//&ci是常量地址，auto推断为const int*
//const auto f = ci;//ci是常量，auto推断为int
//auto& g = ci;//ci是int型常量，auto推断为cosnt int
//auto& h = 42;//报错！42是字面值常量，无法引用
//const auto& j = 42;//42是字面值常量，可能被const auto引用

// 利用本节定义的变量，判断下列语句的运行结果。

//a = 42; // 正常
//b = 42; // 正常
//c = 42; // 正常
//d = 42; // 报错 d是int类型指针
//e = 42; // 报错 e是int类型指向常量的指针
//g = 42; // 报错 g是int类型常量的引用

#include <iostream>
using namespace std;

int main()
{
	int i = 0, & r = i;
	auto a = r;
	const int ci = i, & cr = ci;
	auto b = ci;
	auto c = cr;
	auto d = &i;
	auto e = &ci;
	const auto f = ci;
	auto& g = ci;

	a = 42;
	cout << "a=" << a << endl;
	b = 42;
	cout << "b=" << b << endl;
	c = 42;
	cout << "c=" << c << endl;
	*d = 42;
	cout << "*d =" << *d << endl;
	//*e 无法更改;
	cout << "*e=" << *e << endl;
	//f 无法更改
	cout << "f=" << f << endl;

}


